#include <stdio.h>
#include <string.h>
#include <stdlib.h>
#include <ctype.h>

#define TAM_REG 450
#define MAX_TITULO 201
#define MAX_TIPO 101
#define MAX_AUTOR 126
#define MAX_ANO 4
#define MAX_VALOR 12
#define MAX_IMAGEM 10

typedef struct sec {                /*estrutura que armazena os registros das chaves secundárias, com a palavra no campo nome, o tamanho dessa string no campo tam_string e o apontador para o próximo registro no campo pos*/
char nome[MAX_TITULO];
int tam_string;
int pos;
}AtrSec;

typedef struct vetor{ /*estrutura que contém o vetor com os registros das chaves secundárias carregadas na memória, tam_disco é o tamanho de registros de chaves primárias, e tam é o número de registros no vetor*/
AtrSec *vetor;
int tam;
int tam_disco;
}VetSec;

typedef struct obra {               /*estrutura que armazena os dados da obra atual na RAM*/ 
    char Titulo[MAX_TITULO];
    char Tipo[MAX_TIPO];
    char Autor[MAX_AUTOR];
    int Ano[MAX_ANO];
    int Valor[MAX_VALOR];
    char Imagem[MAX_IMAGEM];
} Obra;

typedef struct chave_prim {         /*estrutura contendo a chave primaria e seu respectivo NRR*/
	char Titulo[MAX_TITULO];
	int nrr;
} Chave_prim;

typedef struct registro{            /*estrutura que contem o vetor com os registros carregados na memoria*/
	Chave_prim *vetor;                /*mais a quantidade de registros*/
	int quantidade;
}Registro;
	
/*funcao que imprime o menu principal, para evitar repeticao*/ 
void ImprimeMenu(); 
/*funcao que recebe como parametro um vetor de caracteres e seu tamanho, retornando este mesmo vetor escaneado*/
char *Scaneia(char *campo, int tamanho);
/*funcao que escaneia todos os campos de uma nova estrutura*/
void  ScaneiaObra(Obra *novo, Registro *reg); 
/*funcao que imprime na base de dados a ultima estrutura escaneada*/
void FilePrint(Obra *novo, FILE **fpt);
/*funcao que recebe um vetor de caracteres e seu tamanho, retornando este mesmo vetor preenchido com espacos*/
char *CompletaString(char *campo, int tamanho);
/*funcao que recebe um caractere, informando se este corresponde ou nao a um numero*/
int VerificaNum(char i);
/*funcao que recebe um registro como parametro e carrega o arquivo de chaves primarias ja existente para o mesmo*/
void LoadChaves(Registro *reg);
/*funcao que recebe os registros da memoria como parametro e grava-os no arquivo de chaves primarias ao final da execucao do programa*/ 
void GravaChaves(Registro *reg);
/*funcao que busca um vetor 'alvo' recebido como parametro nos registros da memoria, tambem recebidos como parametro, para dois casos definidos pelo parametro inteiro 'caso'(0 para busca utilizada internamente, para verificar insercoes de chaves primarias repetidas, e 1 para busca do usuario por alguma obra)*/ 
int Busca(Registro *reg, int caso, char *alvo);
/*funcao que lista todas as obras inseridas na base de dados, atraves dos registros da memoria passados como parametro*/
void Lista(Registro *reg);
/*funcao que passa para a memoria a chave primaria e o nrr do ultimo registro escaneado*/
void JogaRam(Registro *reg, Obra *novo);
/*funcao de string-compare modificada para ser usada nas funcoes qsort e bsearch*/
int nosso_strcmp(const void* str1, const void* str2);
/*funcao que gera o html quando eh realizada uma busca ou uma listagem*/
void make_html (FILE **fpt, int tipo, Registro *reg);

/*funcao que gera o indice secundario, partindo do principio de que ainda nao existe
nenhuma base de dados ou indices secundarios jah existentes*/
void Gera_Ind_Sec(Obra *novo, VetSec *SKindSec, int cod);

/**/
void GravaChavesSec(VetSec *Tipo, VetSec *Autor, VetSec *Ano, VetSec *Titulo);

void buscaXXX(VetSec *X,char *campo, int i, Registro *reg);

void BuscaSec(VetSec *Tipo, VetSec *Autor, VetSec *Ano, VetSec *Titulo, Registro *reg);
/*funcao que carrega para a RAM os dados das chaves secundarias a partir dos arquivos*/
void LoadRamSec (VetSec *Vet, int tipo, Obra *novo);

void ImprimeBusca(Registro *reg);

void Remocao(Registro *reg, Registro *B);

int nosso_strcmp2(const void* str1, const void* str2);
